// 函数参数

// 1、形参: 定义函数时在参数列表中指定的变量
function add(a, b){
    return a + b;
}

let a = 100;
let b = 200;
// 2、实参: 调用函数时实际传入的值
let res = add(a, b );
console.log( res );

// 3、参数默认值
//    在定义形参时用`=`运算符为变量赋的值就是默认值
function divide( a = 1, b = 1 ) {
    console.log(`求 ${a} 除以 ${b} 的商`);
    return a / b ;
}

// 若未显式传入参数则使用参数默认值
res = divide();
console.log( res );

res = divide(10);
console.log( res );

// 若显式传入了参数则使用实际传入的参数值
res = divide(10, 2);
console.log( res );

// 4、剩余参数(国内资料上通常称作`rest参数`)
// 调用sum函数时，前两个实参会分别初始化a和b，剩余参数统统放入到numbers中
function sum(a, b, ...numbers) {
    let s = a + b;
    // 在函数内部将用`...args`形式定义的参数当作数组处理
    for(let i = 0 ; i < numbers.length; i++){
        let n = numbers[ i ];
        s += n;
    }
    return s;
}

console.log( sum() ); // NaN
console.log( sum(1, 2) ); // 3
console.log( sum(1, 2, 3, 4, 5, 6, 7 ,8 , 9, 10 ) ); // 55

// 同一个函数的形参列表中至多出现一个rest参数，且必须出现在形参列表末尾
function total(...values) {
    let t = 0;
    for(let i = 0 ; i < values.length; i++){
        let n = values[ i ];
        t += n;
    }
    return t;
}

console.log( total() );
console.log( total(1) );
console.log( total(1, 2) );
console.log( total(1, 2, 3) );

let arr = [ 2, 4, 6, 8, 10 ];
let t = total( arr[0], arr[1], arr[2], arr[3], arr[4] );
console.log( t );
// 5、展开(spread)参数
// 将 arr 展开后把 arr 中各个元素依次传入给 total 函数
let s = total(...arr); // 此时`...`被称作展开运算符
console.log( s );